"""
数据工具类，提供真随机数生成和随机抽取功能
"""

import random
import secrets
import string
from typing import List, Any, Union


class DataUtils:
    """
    数据工具类，提供各种数据处理功能
    """
    
    # 常用汉字字符集（简化版）
    CHINESE_CHARACTERS = (
        "的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能"
        "下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实"
        "加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间"
        "样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军"
        "很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资"
        "边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取"
        "据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共"
        "权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类"
        "八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织"
        "装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳"
        "便团往酸历市克何除消构府称太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养"
        "易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严龙飞"
    )

    @staticmethod
    def generate_true_random_string(length: int, charset: str = None) -> str:
        """
        生成真随机字符串

        :param length: 字符串长度
        :param charset: 字符集，默认为字母数字
        :return: 真随机字符串
        """
        if charset is None:
            charset = string.ascii_letters + string.digits
        
        return ''.join(secrets.choice(charset) for _ in range(length))

    @staticmethod
    def generate_true_random_chinese_string(length: int) -> str:
        """
        生成真随机汉字字符串

        :param length: 字符串长度
        :return: 真随机汉字字符串
        """
        return ''.join(secrets.choice(DataUtils.CHINESE_CHARACTERS) for _ in range(length))

    @staticmethod
    def generate_true_random_mixed_string(length: int, include_digits: bool = True, 
                                         include_letters: bool = True, include_chinese: bool = True) -> str:
        """
        生成真随机混合字符串（包含数字、英文字母、汉字等）

        :param length: 字符串长度
        :param include_digits: 是否包含数字
        :param include_letters: 是否包含英文字母
        :param include_chinese: 是否包含汉字
        :return: 真随机混合字符串
        """
        charset = ""
        if include_digits:
            charset += string.digits
        if include_letters:
            charset += string.ascii_letters
        if include_chinese:
            charset += DataUtils.CHINESE_CHARACTERS
            
        if not charset:
            raise ValueError("至少需要包含一种字符类型")
            
        return ''.join(secrets.choice(charset) for _ in range(length))

    @staticmethod
    def generate_true_random_number(min_value: int, max_value: int) -> int:
        """
        生成真随机整数

        :param min_value: 最小值
        :param max_value: 最大值
        :return: 真随机整数
        """
        return secrets.randbelow(max_value - min_value + 1) + min_value

    @staticmethod
    def generate_true_random_float(min_value: float, max_value: float, precision: int = 2) -> float:
        """
        生成真随机浮点数

        :param min_value: 最小值
        :param max_value: 最大值
        :param precision: 精度（小数点后位数）
        :return: 真随机浮点数
        """
        random_int = secrets.randbelow(10 ** precision)
        random_float = random_int / (10 ** precision)
        return min_value + random_float * (max_value - min_value)

    @staticmethod
    def generate_true_random_bytes(length: int) -> bytes:
        """
        生成真随机字节串

        :param length: 字节串长度
        :return: 真随机字节串
        """
        return secrets.token_bytes(length)

    @staticmethod
    def generate_true_random_hex(length: int) -> str:
        """
        生成真随机十六进制字符串

        :param length: 十六进制字符串长度（生成的字符串长度为2*length）
        :return: 真随机十六进制字符串
        """
        return secrets.token_hex(length)

    @staticmethod
    def generate_true_random_urlsafe_string(length: int) -> str:
        """
        生成真随机URL安全字符串

        :param length: 字符串长度
        :return: 真随机URL安全字符串
        """
        return secrets.token_urlsafe(length)

    @staticmethod
    def random_choice(sequence: List[Any]) -> Any:
        """
        从序列中随机抽取一个元素

        :param sequence: 序列（列表、元组等）
        :return: 随机抽取的元素
        """
        if not sequence:
            raise ValueError("序列不能为空")
        return random.choice(sequence)

    @staticmethod
    def random_choices(sequence: List[Any], k: int = 1, weights: List[float] = None) -> List[Any]:
        """
        从序列中随机抽取多个元素（可重复）

        :param sequence: 序列（列表、元组等）
        :param k: 抽取数量
        :param weights: 权重列表
        :return: 随机抽取的元素列表
        """
        if not sequence:
            raise ValueError("序列不能为空")
        return random.choices(sequence, weights=weights, k=k)

    @staticmethod
    def random_sample(sequence: List[Any], k: int) -> List[Any]:
        """
        从序列中随机抽样（不重复）

        :param sequence: 序列（列表、元组等）
        :param k: 抽取数量
        :return: 随机抽样的元素列表
        """
        if not sequence:
            raise ValueError("序列不能为空")
        if k > len(sequence):
            raise ValueError("抽样数量不能大于序列长度")
        return random.sample(sequence, k)

    @staticmethod
    def shuffle(sequence: List[Any]) -> List[Any]:
        """
        随机打乱序列

        :param sequence: 序列（列表、元组等）
        :return: 打乱后的序列
        """
        if not sequence:
            return sequence
        shuffled = sequence.copy()
        random.shuffle(shuffled)
        return shuffled

    @staticmethod
    def random_uniform(min_value: float, max_value: float) -> float:
        """
        生成指定范围内的随机浮点数

        :param min_value: 最小值
        :param max_value: 最大值
        :return: 随机浮点数
        """
        return random.uniform(min_value, max_value)

    @staticmethod
    def random_gauss(mu: float, sigma: float) -> float:
        """
        生成高斯分布（正态分布）随机数

        :param mu: 均值
        :param sigma: 标准差
        :return: 高斯分布随机数
        """
        return random.gauss(mu, sigma)